package ar.edu.unrn.lia.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.model.SelectItem;

import ar.edu.unrn.lia.model.Alquiler;
import ar.edu.unrn.lia.model.Barrio.Zona;
import ar.edu.unrn.lia.model.Coordenada;
import ar.edu.unrn.lia.model.Cuenta.Grupo;
import ar.edu.unrn.lia.model.Cuenta.SubGrupo;
import ar.edu.unrn.lia.model.Movimiento.TipoFactura;
import ar.edu.unrn.lia.model.Movimiento.TipoMovimiento;
import ar.edu.unrn.lia.model.Propiedad;
import ar.edu.unrn.lia.model.Propiedad.AlquilerVenta;
import ar.edu.unrn.lia.model.Propiedad.Estado;
import ar.edu.unrn.lia.model.PropiedadTipo;
import ar.edu.unrn.lia.model.PuntoInteres.Tipo;
import ar.edu.unrn.lia.model.Recibo.Concepto;
import ar.edu.unrn.lia.service.PropiedadTipoService;

@ManagedBean(name = "utilsBean")
@ApplicationScoped
public class UtilsBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public final static  String MESSAGE_OK = "MESSAGE_OK";
	
	public final static  Coordenada LATLONG = new Coordenada(-40.822606122936996,-62.97862706533941);

	@ManagedProperty(value = "#{propiedadTipoService}")
	PropiedadTipoService propiedadTipoService;

	public PropiedadTipoService getPropiedadTipoService() {
		return propiedadTipoService;
	}

	public void setPropiedadTipoService(
			PropiedadTipoService propiedadTipoService) {
		this.propiedadTipoService = propiedadTipoService;
	}

		
	private SelectItem[] tipoPuntoInteres;
	
	private SelectItem[] propiedadEstados;

	private SelectItem[] estados;

	private SelectItem[] propiedadTipo;

	private SelectItem[] disponibilidad;
	
	private SelectItem[] grupo;
	
	private SelectItem[] subGrupo;
	
	private SelectItem[] cuentaEstado;

	private SelectItem[] tipoMovimiento;

	private SelectItem[] tipoFactura;
	
	private SelectItem[] tipoMovimientoSinTodos;
	
	private SelectItem[] tipoFacturaSinTodos;

	private SelectItem[] disponibilidadSinTodos;

	private static final List<SelectItem> meses;
	static {
		meses = new ArrayList<SelectItem>();
		meses.add(new SelectItem(6L, "6 Meses"));
		meses.add(new SelectItem(12L, "12 Meses"));
	}

	private static final List<SelectItem> cantidadFiltros;
	static {
		cantidadFiltros = new ArrayList<SelectItem>();
		cantidadFiltros.add(new SelectItem(-1, "Indistinto"));
		cantidadFiltros.add(new SelectItem(0, "Sin"));
		cantidadFiltros.add(new SelectItem(1, "1"));
		cantidadFiltros.add(new SelectItem(2, "2"));
		cantidadFiltros.add(new SelectItem(3, "3"));
		cantidadFiltros.add(new SelectItem(4, "4"));
	}

	private static final List<SelectItem> booleanFiltros;
	static {
		booleanFiltros = new ArrayList<SelectItem>();
		booleanFiltros.add(new SelectItem(-1, "Indistinto"));
		booleanFiltros.add(new SelectItem(1, "Con"));
		booleanFiltros.add(new SelectItem(0, "Sin"));
	}
	
	

	public SelectItem[] getCuentaEstado() {
		return cuentaEstado;
	}

	public void setCuentaEstado(SelectItem[] cuentaEstado) {
		this.cuentaEstado = cuentaEstado;
	}

	public SelectItem[] getGrupo() {
		return grupo;
	}

	public void setGrupo(SelectItem[] grupo) {
		this.grupo = grupo;
	}

	public SelectItem[] getSubGrupo() {
		return subGrupo;
	}

	public void setSubGrupo(SelectItem[] subGrupo) {
		this.subGrupo = subGrupo;
	}

	public void setEstados(SelectItem[] estados) {
		this.estados = estados;
	}

	public SelectItem[] getTipoMovimientoSinTodos() {
		return tipoMovimientoSinTodos;
	}

	public void setTipoMovimientoSinTodos(SelectItem[] tipoMovimientoSinTodos) {
		this.tipoMovimientoSinTodos = tipoMovimientoSinTodos;
	}

	public SelectItem[] getTipoFacturaSinTodos() {
		return tipoFacturaSinTodos;
	}

	public void setTipoFacturaSinTodos(SelectItem[] tipoFacturaSinTodos) {
		this.tipoFacturaSinTodos = tipoFacturaSinTodos;
	}

	public SelectItem[] getTipoMovimiento() {
		return tipoMovimiento;
	}

	public void setTipoMovimiento(SelectItem[] tipoMovimiento) {
		this.tipoMovimiento = tipoMovimiento;
	}

	public SelectItem[] getTipoFactura() {
		return tipoFactura;
	}

	public void setTipoFactura(SelectItem[] tipoFactura) {
		this.tipoFactura = tipoFactura;
	}

	public List<SelectItem> getBooleanfiltros() {
		return booleanFiltros;
	}

	public List<SelectItem> getCantidadFiltros() {
		return cantidadFiltros;
	}

	public SelectItem[] getEstados() {
		return estados;
	}

	public List<SelectItem> getMeses() {
		return meses;
	}

	public SelectItem[] getDisponibilidad() {
		return disponibilidad;
	}

	public void setDisponibilidad(SelectItem[] disponibilidad) {
		this.disponibilidad = disponibilidad;
	}

	public SelectItem[] getPropiedadEstados() {
		return propiedadEstados;
	}

	public void setPropiedadEstados(SelectItem[] propiedadEstados) {
		this.propiedadEstados = propiedadEstados;
	}

	public SelectItem[] getDisponibilidadSinTodos() {
		return disponibilidadSinTodos;
	}

	public void setDisponibilidadSinTodos(SelectItem[] disponibilidadSinTodos) {
		this.disponibilidadSinTodos = disponibilidadSinTodos;
	}

	public SelectItem[] getPropiedadTipo() {
		return propiedadTipo;
	}

	public void setPropiedadTipo(SelectItem[] propiedadTipo) {
		this.propiedadTipo = propiedadTipo;
	}
	
	

	public SelectItem[] getTipoPuntoInteres() {
		return tipoPuntoInteres;
	}

	public void setTipoPuntoInteres(SelectItem[] tipoPuntoInteres) {
		this.tipoPuntoInteres = tipoPuntoInteres;
	}

	@PostConstruct
	private void init() {
		int index = 0;
		setDisponibilidadSinTodos(new SelectItem[Propiedad.AlquilerVenta
				.values().length]);
		for (AlquilerVenta av : Propiedad.AlquilerVenta.values()) {
			this.disponibilidadSinTodos[index++] = new SelectItem(av,
					av.toString());
		}

		setDisponibilidad(new SelectItem[Propiedad.AlquilerVenta.values().length + 1]);
		index = 0;
		this.disponibilidad[index++] = new SelectItem("", "Todos");
		for (AlquilerVenta av : Propiedad.AlquilerVenta.values()) {
			this.disponibilidad[index++] = new SelectItem(av, av.toString());
		}

		this.estados = new SelectItem[Alquiler.AlquilerEstado.values().length + 1];
		index = 0;
		this.estados[index++] = new SelectItem("", "Todos");
		for (Alquiler.AlquilerEstado av : Alquiler.AlquilerEstado.values()) {
			this.estados[index++] = new SelectItem(av, av.toString());
		}

		this.propiedadEstados = new SelectItem[Estado.values().length + 1];
		index = 0;
		this.propiedadEstados[index++] = new SelectItem("", "Todos");
		for (Estado av : Estado.values()) {
			this.propiedadEstados[index++] = new SelectItem(av, av.toString());
		}
		index = 0;
		List<PropiedadTipo> pts = getPropiedadTipoService().getAll();
		this.propiedadTipo = new SelectItem[pts.size() + 1];
		this.propiedadTipo[index++] = new SelectItem(-1L, "Todos");
		for (PropiedadTipo pt : pts) {
			this.propiedadTipo[index++] = new SelectItem(pt.getId(),
					pt.getDescripcion());
		}

		this.tipoMovimiento = new SelectItem[TipoMovimiento.values().length + 1];
		index = 0;
		this.tipoMovimiento[index++] = new SelectItem("", "Todos");
		for (TipoMovimiento av : TipoMovimiento.values()) {
			this.tipoMovimiento[index++] = new SelectItem(av, av.toString());
		}

		this.tipoFactura = new SelectItem[TipoFactura.values().length + 1];
		index = 0;
		this.tipoFactura[index++] = new SelectItem("", "Todos");
		for (TipoFactura av : TipoFactura.values()) {
			this.tipoFactura[index++] = new SelectItem(av, av.toString());
		}
		
		
		this.tipoMovimientoSinTodos = new SelectItem[TipoMovimiento.values().length];
		index = 0;
		for (TipoMovimiento av : TipoMovimiento.values()) {
			this.tipoMovimientoSinTodos[index++] = new SelectItem(av, av.toString());
		}

		this.tipoFacturaSinTodos = new SelectItem[TipoFactura.values().length];
		index = 0;		
		for (TipoFactura av : TipoFactura.values()) {
			this.tipoFacturaSinTodos[index++] = new SelectItem(av, av.toString());
		}
		
		
		setGrupo(new SelectItem[Grupo.values().length + 1]);
		index = 0;
		this.grupo[index++] = new SelectItem("", "Todos");
		for (Grupo av : Grupo.values()) {
			this.grupo[index++] = new SelectItem(av, av.toString());
		}
		
		setSubGrupo(new SelectItem[SubGrupo.values().length + 1]);
		index = 0;
		this.subGrupo[index++] = new SelectItem("", "Todos");
		for (SubGrupo av : SubGrupo.values()) {
			this.subGrupo[index++] = new SelectItem(av, av.toString());
		}
		
		setCuentaEstado(new SelectItem[ar.edu.unrn.lia.model.Cuenta.Estado.values().length + 1]);
		index = 0;
		this.cuentaEstado[index++] = new SelectItem("", "Todos");
		for (ar.edu.unrn.lia.model.Cuenta.Estado av : ar.edu.unrn.lia.model.Cuenta.Estado.values()) {
			this.cuentaEstado[index++] = new SelectItem(av, av.toString());
		}
		
		setTipoPuntoInteres(new SelectItem[Tipo.values().length]);
		index = 0;		
		for (Tipo av : Tipo.values()) {
			this.tipoPuntoInteres[index++] = new SelectItem(av, av.toString());
		}
	}
	
	public  SelectItem[] zonas()
	{
		 SelectItem[] resultado = new SelectItem[Zona.values().length];
		 int index = 0;		
			for (Zona av : Zona.values()) {
				resultado[index++] = new SelectItem(av, av.toString());
			}
		return resultado;		
	}
	
	public  SelectItem[] zonasTodos()
	{
		 SelectItem[] resultado = new SelectItem[Zona.values().length+1];
		 int index = 0;		
		 resultado[index++] = new SelectItem("", "Todos");
			for (Zona av : Zona.values()) {
				resultado[index++] = new SelectItem(av, av.toString());
			}
		return resultado;		
	}
	
	public  SelectItem[] estadoCuenta()
	{
		 SelectItem[] resultado = new SelectItem[ar.edu.unrn.lia.model.Cuenta.Estado.values().length];
		 int index = 0;		
			for (ar.edu.unrn.lia.model.Cuenta.Estado av : ar.edu.unrn.lia.model.Cuenta.Estado.values()) {
				resultado[index++] = new SelectItem(av, av.toString());
			}
		return resultado;		
	}
	
	public  SelectItem[] estadoCuentaTodos()
	{
		 SelectItem[] resultado = new SelectItem[ar.edu.unrn.lia.model.Cuenta.Estado.values().length+1];
		 int index = 0;		
		 resultado[index++] = new SelectItem("", "Todos");
			for (ar.edu.unrn.lia.model.Cuenta.Estado av : ar.edu.unrn.lia.model.Cuenta.Estado.values()) {
				resultado[index++] = new SelectItem(av, av.toString());
			}
		return resultado;		
	}
	
	public  SelectItem[] conceptoRecibo()
	{
		 SelectItem[] resultado = new SelectItem[Concepto.values().length];
		 int index = 0;		
			for (Concepto av : Concepto.values()) {
				resultado[index++] = new SelectItem(av, av.toString());
			}
		return resultado;		
	}
	
		
}
